個人CodeBase紀錄 - EP.4 你說你錯了,那你錯在哪? NLog套件當你的貼身小祕...


Posted by Mike.Lin on 2023-09-21

這篇來記錄NLog的設定及基本使用,讓我們在開發過程及維護專案時,有更多資訊可以協助判斷。


首先,下載兩個nuget:

  1. NLog
  2. NLog.Schema

裝完後可以看到專案中多了NLog相關檔案

先來做些基本設定,紀錄方式為File,此logger規則為紀錄Debug以上層級(因Debug為最低層級,因此等於所有層級)。
其中fileName定義了Log檔路徑及名稱;Layout則定義了紀錄資訊的格式,也可傳自定義的屬性參數。

<targets>
    <!--log檔要儲存的路徑-->
    <target xsi:type="File" name="test" 
            fileName="${basedir}/App_Data/Logs/${shortdate}/${logger}.txt"
            layout="${longdate} ${uppercase:${level}} ${message} ${event-properties:Property1} ${event-properties:Property2}" />
</targets>

<rules>
  <!--以檔案形式儲存-->
  <logger name="*" minlevel="Debug" writeTo="test" />
</rules>

接下來在我們把對logger操作寫在自定義的ActionFilter內,讓logger方便重複使用

public class ActionLogFilter: ActionFilterAttribute
{
    private NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var controller = filterContext.Controller.ControllerContext;
        var userName = controller.HttpContext.User.Identity.Name;
        var ip = controller.HttpContext.Request.UserHostAddress;
        var actionName = controller.RouteData.Values["action"];

        logger
          .WithProperty("Property1", userName)
          .WithProperty("Property2", ip)
          .Info($"{userName} Request {actionName} Page");

        base.OnActionExecuting(filterContext);
    }
}

如此,便可直接再controller或action上做註冊

[ActionLogFilter]
public class HomeController : BaseController
{
    ...
}

或是直接註冊在Global.asax.cs

protected void Application_Start()
{
    // 全域註冊
    GlobalFilters.Filters.Add(new Filters.NLogFilters.ActionLogFilter());

    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}

以上,一個簡單的log小秘就完成了,我們可以透過不同層級的logger,將特定資訊或是Exception寫成log檔,如下:

ps. 除了file的方式,NLog亦提供了其他方式,詳見下一篇。


參考資料:
ASP.NET MVC NLog Tutorial
Logging Troubleshooting
使用NLog - Advanced .NET Logging (2)


#.Net Mvc #NLog







Related Posts

Customise mat datepicker header

Customise mat datepicker header

人性較量Day04~此時有聲勝無聲

人性較量Day04~此時有聲勝無聲

D12_綜合題目練習 Lv1

D12_綜合題目練習 Lv1


Comments